<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace Think;
/**
 * ThinkPHP 封装运行时上下文
 */
class Context {
	/**
	 * 附加的参数
	 *
	 * @var array
	 */
	private $_params = array();
	
	/**
	 * 构造函数
	 */
	public function __construct()
	{
	}
	
	/**
	 * 魔法方法，访问请求参数
	 *
	 * __get() 魔法方法让开发者可以用 $context->parameter 的形式访问请求参数。
	 * 如果指定的参数不存在，则返回 null。
	 *
	 * @code php
	 * $title = $context->title;
	 * @endcode
	 *
	 * 查找请求参数的顺行是 $_GET、$_POST 和 API_Core_Context 对象附加参数。
	 *
	 * @param string $parameter 要访问的请求参数
	 *
	 * @return mixed 参数值
	 */
	function __get($parameter)
	{
		return $this->query($parameter);
	}
	
	/**
	 * 魔法方法，设置附加参数
	 *
	 * 与 __get() 魔法方法不同，__set() 仅仅设置 API_Core_Context 对象附加参数。
	 * 因此当 $_GET 或 $_POST 中包含同名参数时，用 __set() 设置的参数值
	 * 只能使用 API_Core_Context::param() 方法来获得。
	 *
	 * @code php
	 * $context->title = $title;
	 * echo $context->param('title');
	 * @endcode
	 *
	 * @param string $parameter 要设置值的参数名
	 * @param mixed $value 参数值
	 */
	function __set($parameter, $value)
	{
		$this->changeParam($parameter, $value);
	}
	/**
	 * 设置 API_Core_Context 对象的附加参数
	 *
	 * @code php
	 * $context->changeParam('arg', $value);
	 * @endcode
	 *
	 * @param string $parameter 要设置的参数名
	 * @param mixed $value 参数值
	 *
	 * @return API_Core_Context 返回 API_Core_Context 对象本身，实现连贯接口
	 */
	function changeParam($parameter, $value)
	{
		$this->_params[$parameter] = $value;
	}	
	/**
	 * 魔法方法，确定是否包含指定的参数
	 *
	 * @param string $parameter 要检查的参数
	 *
	 * @return boolean 是否具有指定参数
	 */
	function __isset($parameter)
	{
		return $this->offsetExists($parameter);
	}
	/**
	 * 确定是否包含指定的参数，实现 ArrayAccess 接口
	 *
	 * @code php
	 * echo isset($context['title']);
	 * @endcode
	 *
	 * @param string $parameter 要检查的参数
	 *
	 * @return boolean 参数是否存在
	 */
	function offsetExists($parameter)
	{
		if (isset($_GET[$parameter]))
			return true;
		elseif (isset($_POST[$parameter]))
		return true;
		else
			return isset($this->_params[$parameter]);
	}
	/**
	 * 删除指定的附加参数
	 *
	 * __unset() 魔法方法只影响 API_Core_Context 对象的附加参数。
	 *
	 * @code php
	 * unset($context['title']);
	 * // 此时读取 title 附加参数将获得 null
	 * echo $context->param('title');
	 * @endcode
	 *
	 * @param string $parameter 要删除的参数
	 */
	function __unset($parameter)
	{
		unset($this->_params[$parameter]);
	}
	
    /**
     * 魔法方法，访问请求参数
     *
     * API_Core_Context::get() 方法让开发者可以用 $context->parameter 的形式访问请求参数。
     * 如果指定的参数不存在，则返回 $default 参数指定的默认值。
     *
     * @code php
     * $title = $context->query('title', 'default title');
     * @endcode
     *
     * 查找请求参数的顺行是 $_GET、$_POST 和 API_Core_Context 对象附加参数。
     *
     * @param string $parameter 要访问的请求参数
     * @param mixed $default 参数不存在时要返回的默认值
     *
     * @return mixed 参数值
     */
    function query($parameter, $default = null)
    {
        if (isset($_GET[$parameter]))
            return $_GET[$parameter];
        elseif (isset($_POST[$parameter]))
            return $_POST[$parameter];
        elseif (isset($this->_params[$parameter]))
            return $this->_params[$parameter];
        else
            return $default;
    }
    
    /**
     * 获得 GET 数据
     *
     * 从 $_GET 中获得指定参数，如果参数不存在则返回 $default 指定的默认值。
     *
     * @code php
     * $title = $context->get('title', 'default title');
     * @endcode
     *
     * 如果 $parameter 参数为 null，则返回整个 $_GET 的内容。
     *
     * @param string $parameter 要查询的参数名
     * @param mixed $default 参数不存在时要返回的默认值
     *
     * @return mixed 参数值
     */
    function get($parameter = null, $default = null)
    {
    	if (is_null($parameter))
    		return $_GET;
    	return isset($_GET[$parameter]) ? $_GET[$parameter] : $default;
    }
    
    /**
     * 获得 POST 数据
     *
     * 从 $_POST 中获得指定参数，如果参数不存在则返回 $default 指定的默认值。
     *
     * @code php
     * $body = $context->post('body', 'default body');
     * @endcode
     *
     * 如果 $parameter 参数为 null，则返回整个 $_POST 的内容。
     *
     * @param string $parameter 要查询的参数名
     * @param mixed $default 参数不存在时要返回的默认值
     *
     * @return mixed 参数值
     */
    function post($parameter = null, $default = null)
    {
    	if (is_null($parameter))
    		return $_POST;
    	return isset($_POST[$parameter]) ? $_POST[$parameter] : $default;
    }
    
    /**
     * 获得 Cookie 数据
     *
     * 从 $_COOKIE 中获得指定参数，如果参数不存在则返回 $default 指定的默认值。
     *
     * @code php
     * $auto_login = $context->cookie('auto_login');
     * @endcode
     *
     * 如果 $parameter 参数为 null，则返回整个 $_COOKIE 的内容。
     *
     * @param string $parameter 要查询的参数名
     * @param mixed $default 参数不存在时要返回的默认值
     *
     * @return mixed 参数值
     */
    function cookie($parameter = null, $default = null)
    {
    	if (is_null($parameter))
    		return $_COOKIE;
    	return isset($_COOKIE[$parameter]) ? $_COOKIE[$parameter] : $default;
    }
    
    
}